package com.shangguosha.model.characters;

import com.shangguosha.model.Character;
import com.shangguosha.model.Card;
import com.shangguosha.model.Skill;
import com.shangguosha.model.enums.Gender;
import com.shangguosha.model.enums.Kingdom;
import com.shangguosha.model.enums.SkillType;
import com.shangguosha.model.skills.RenDe;
import lombok.extern.slf4j.Slf4j;

/**
 * 刘备角色类
 * 技能：仁德 - 出牌阶段，你可以将任意数量的手牌交给其他角色，然后你于此回合内不能再对其他角色使用【杀】。
 */
@Slf4j
public class LiuBei extends Character {
    
    public LiuBei(String id, String name, Kingdom kingdom, Gender gender, int maxHp) {
        super(id, name, kingdom, gender, maxHp);
    }
    
    public LiuBei(String id) {
        super(id, "刘备", Kingdom.SHU, Gender.MALE, 4);
    }
    
    @Override
    protected void initializeSkills() {
        // 添加仁德技能
        RenDe renDe = new RenDe("rende_" + getId(), this);
        addSkill(renDe);
        
        log.info("刘备 {} 初始化技能：仁德", getName());
    }
    
    public String getCharacterDescription() {
        return "蜀汉昭烈帝，以仁德著称，能够将手牌分给其他角色。";
    }
    
    /**
     * 检查是否可以使用仁德技能
     */
    public boolean canUseRenDe() {
        // 检查是否有手牌
        if (getHandCards().isEmpty()) {
            return false;
        }
        
        // 检查是否有其他存活角色
//        if (getGameContext() != null) {
//            return getGameContext().getAlivePlayers().size() > 1;
//        }
        
        return true;
    }
    
    /**
     * 使用仁德技能给予卡牌
     */
    public boolean useRenDe(Character target, Card card) {
        if (!canUseRenDe()) {
            log.warn("刘备 {} 无法使用仁德技能", getName());
            return false;
        }
        
        if (target == null || target == this) {
            log.warn("刘备 {} 仁德技能目标无效", getName());
            return false;
        }
        
        if (!getHandCards().contains(card)) {
            log.warn("刘备 {} 没有指定的卡牌", getName());
            return false;
        }
        
        // 执行仁德
//        removeHandCard(card);
        target.drawCard(card);
        
        // 触发仁德技能效果
        RenDe renDeSkill = (RenDe) getSkills().stream()
                .filter(skill -> skill instanceof RenDe)
                .findFirst()
                .orElse(null);
        
        if (renDeSkill != null) {
            renDeSkill.onCardGiven(target, card);
        }
        
        log.info("刘备 {} 使用仁德，将 {} 给予 {}", getName(), card.getName(), target.getName());
        return true;
    }
    
    /**
     * 批量使用仁德技能
     */
    public boolean useRenDe(Character target, java.util.List<Card> cards) {
        if (cards == null || cards.isEmpty()) {
            return false;
        }
        
        // 检查所有卡牌是否都在手牌中
        for (Card card : cards) {
            if (!getHandCards().contains(card)) {
                log.warn("刘备 {} 没有卡牌 {}", getName(), card.getName());
                return false;
            }
        }
        
        // 执行批量仁德
        boolean success = true;
        for (Card card : cards) {
            if (!useRenDe(target, card)) {
                success = false;
                break;
            }
        }
        
        return success;
    }
    
    @Override
    public LiuBei clone() {
        LiuBei cloned = new LiuBei(getId() + "_clone", getName(), getKingdom(), getGender(), getMaxHp());
        // 复制当前状态
        cloned.setCurrentHp(getCurrentHp());
        cloned.setAlive(isAlive());
        cloned.setChained(isChained());
        cloned.setFlipped(isFlipped());
        
        // 复制手牌
        for (Card card : getHandCards()) {
            cloned.drawCard(card.clone());
        }
        
        return cloned;
    }
}